package cl.agrosuper.dao
{
	import cl.agrosuper.to.GrupoItemAuditoria;
	
	import flash.data.SQLConnection;
	import flash.data.SQLResult;
	import flash.data.SQLStatement;
	import flash.events.SQLEvent;
	
	import mx.collections.ArrayCollection;

	public class GrupoItemDB
	{
		private var conn:SQLConnection;
		private var statement:SQLStatement;
		private var _callback:Function;
		private var itemAuditoriaDB:ItemAuditoriaDB;
		
		public function GrupoItemDB(conn:SQLConnection)
		{
			this.conn = conn;
			statement = new SQLStatement();
			statement.itemClass = GrupoItemAuditoria;
			statement.sqlConnection = conn;
		}
		
		public function set callback(value:Function):void
		{
			_callback = value;
		}
		//-------------------------------------------------
		
		public function obtenerGruposItemPlantillaAsync(idPlantilla:int):void{
			statement.text = "SELECT ID id, TITULO titulo " +
							 "FROM grupo_item " +
							 "WHERE id_plantilla = @idPlantilla";
			statement.parameters["@idPlantilla"] = idPlantilla;
			statement.addEventListener(SQLEvent.RESULT, resultObtenerGruposItemPlantilla);
			statement.execute();
		}
		
		private var grupoActual:GrupoItemAuditoria;
		private var arrayGrupos:ArrayCollection;
		private var arrayGruposRetorno:ArrayCollection = new ArrayCollection();
		private function resultObtenerGruposItemPlantilla(event:SQLEvent):void{
			statement.removeEventListener(SQLEvent.RESULT, resultObtenerGruposItemPlantilla);
			statement.clearParameters();
			
			var result:SQLResult = statement.getResult();
			
			if(result){
				arrayGrupos = new ArrayCollection(result.data);
				
				if(arrayGrupos.length > 0){
					var grupo:GrupoItemAuditoria = arrayGrupos.getItemAt(0) as GrupoItemAuditoria;
					arrayGrupos.removeItemAt(0);
					obtenerItemsGrupo(grupo);
				}
			}
		}
		
		private function obtenerItemsGrupo(grupo:GrupoItemAuditoria):void{
			this.grupoActual = grupo;
			if(this.itemAuditoriaDB == null)
				this.itemAuditoriaDB = new ItemAuditoriaDB(this.conn);
			
			itemAuditoriaDB.callback = onObtenerItems;
			itemAuditoriaDB.obtenerItemsGrupoAsync(this.grupoActual.id);
		}
		
		private function onObtenerItems(arrayItems:ArrayCollection):void{
			this.grupoActual.items = arrayItems;
			this.arrayGruposRetorno.addItem(this.grupoActual);
			
			if(arrayGrupos.length > 0){
				var grupo:GrupoItemAuditoria = arrayGrupos.getItemAt(0) as GrupoItemAuditoria;
				arrayGrupos.removeItemAt(0);
				obtenerItemsGrupo(grupo);
			}
			else if(this._callback != null){
				this._callback(this.arrayGruposRetorno);
			}
		}
		
		//-----------------------------
		
		public function obtenerGruposItemPlantilla(idPlantilla:int):ArrayCollection{
			statement.text = "SELECT ID id, TITULO titulo " +
				"FROM grupo_item " +
				"WHERE id_plantilla = @idPlantilla";
			statement.parameters["@idPlantilla"] = idPlantilla;
			statement.execute();
			statement.clearParameters();
			
			var result:SQLResult = statement.getResult();
			
			if(result){
				arrayGrupos = new ArrayCollection(result.data);
				
				if(this.itemAuditoriaDB == null)
					this.itemAuditoriaDB = new ItemAuditoriaDB(this.conn);
				
				for each(var grupoItem:GrupoItemAuditoria in arrayGrupos){
					grupoItem.items = itemAuditoriaDB.obtenerItemsGrupo(grupoItem.id);
				}
				
				return arrayGrupos;
			}
			
			return new ArrayCollection();
		}
		
		public function obtenerGruposItemAuditoria(idAuditoria:int, idPlantilla:int):ArrayCollection{
			statement.text = "SELECT ID id, TITULO titulo " +
							 "FROM grupo_item " +
							 "WHERE id_plantilla = @idPlantilla";
			statement.parameters["@idPlantilla"] = idPlantilla;
			statement.execute();
			statement.clearParameters();
			
			var result:SQLResult = statement.getResult();
			
			if(result){
				arrayGrupos = new ArrayCollection(result.data);
				
				if(this.itemAuditoriaDB == null)
					this.itemAuditoriaDB = new ItemAuditoriaDB(this.conn);
				
				for each(var grupoItem:GrupoItemAuditoria in arrayGrupos){
					grupoItem.items = itemAuditoriaDB.obtenerItemsGrupoAuditoria(grupoItem.id, idAuditoria);
				}
				
				return arrayGrupos;
			}
			
			return new ArrayCollection();
		}
		
	}
}